const axios = require('axios');
const fs = require('fs');
const path = require('path');

// 测试配置
const CONFIG = {
  baseURL: 'http://localhost:3000/api/v1',
  testUser: {
    username: 'user',
    password: '123456'
  },
  outputFile: path.join(__dirname, 'test_video_relationships_results.md')
};

// 记录测试结果
function logResult(message) {
  console.log(message);
  fs.appendFileSync(CONFIG.outputFile, message + '\n');
}

// 初始化测试结果文件
function initTestFile() {
  fs.writeFileSync(CONFIG.outputFile, '# 用户视频关系测试结果\n\n');
  fs.appendFileSync(CONFIG.outputFile, `测试时间: ${new Date().toLocaleString()}\n\n`);
}

// 登录获取token
async function login() {
  try {
    logResult(`正在登录用户: ${CONFIG.testUser.username}`);
    logResult(`尝试登录: ${CONFIG.baseURL}/auth/login`);
    
    const response = await axios.post(`${CONFIG.baseURL}/auth/login`, {
      username: CONFIG.testUser.username,
      password: CONFIG.testUser.password
    });
    
    logResult(`登录响应状态码: ${response.status}`);
    
    if (response.data.success && response.data.data && response.data.data.tokens && response.data.data.tokens.accessToken) {
      logResult('✅ 登录成功！');
      const userInfo = JSON.stringify(response.data.data.user, null, 2);
      logResult(`用户信息: ${userInfo}`);
      return {
        success: true,
        token: response.data.data.tokens.accessToken,
        user: response.data.data.user
      };
    } else {
      logResult('❌ 登录失败: 未找到accessToken');
      return { success: false, error: '登录响应中未找到accessToken' };
    }
  } catch (error) {
    logResult(`❌ 登录失败: ${error.message}`);
    if (error.response) {
      logResult(`❌ 响应状态: ${error.response.status}`);
      logResult(`❌ 响应数据: ${JSON.stringify(error.response.data)}`);
    }
    return { success: false, error: error.message };
  }
}

// 测试检查是否关注视频
async function testCheckFollowingVideo(token) {
  try {
    // 使用视频ID为11进行测试（基于之前看到的SQL查询中的ID）
    const videoId = '11';
    logResult(`\n测试检查是否关注视频...`);
    logResult(`请求URL: ${CONFIG.baseURL}/users/me/following/video/${videoId}`);
    
    const response = await axios.get(`${CONFIG.baseURL}/users/me/following/video/${videoId}`, {
      headers: {
        'Authorization': `Bearer ${token}`
      }
    });
    
    logResult(`响应状态码: ${response.status}`);
    logResult(`响应数据: ${JSON.stringify(response.data, null, 2)}`);
    
    if (response.data.success && 'data' in response.data) {
      logResult(`是否关注: ${response.data.data.isFollowing ? '✅ 已关注' : '❌ 未关注'}`);
      logResult('✅ 检查是否关注视频接口调用成功');
    } else {
      logResult('❌ 接口调用成功但返回数据格式不正确');
    }
    
    return { success: true, data: response.data };
  } catch (error) {
    logResult(`❌ 检查是否关注视频失败`);
    logResult(`❌ 异常信息: ${error.message}`);
    if (error.response) {
      logResult(`❌ 响应状态: ${error.response.status}`);
      logResult(`❌ 响应数据: ${JSON.stringify(error.response.data)}`);
    }
    return { success: false, error: error.response?.data || error.message };
  }
}

// 测试检查是否点赞视频
async function testCheckLikedVideo(token) {
  try {
    // 使用视频ID为11进行测试
    const videoId = '11';
    logResult(`\n测试检查是否点赞视频...`);
    logResult(`请求URL: ${CONFIG.baseURL}/users/me/likes/video/${videoId}/check`);
    
    const response = await axios.get(`${CONFIG.baseURL}/users/me/likes/video/${videoId}/check`, {
      headers: {
        'Authorization': `Bearer ${token}`
      }
    });
    
    logResult(`响应状态码: ${response.status}`);
    logResult(`响应数据: ${JSON.stringify(response.data, null, 2)}`);
    
    if (response.data.success && 'data' in response.data) {
      logResult(`是否点赞: ${response.data.data.isLiked ? '✅ 已点赞' : '❌ 未点赞'}`);
      logResult('✅ 检查是否点赞视频接口调用成功');
    } else {
      logResult('❌ 接口调用成功但返回数据格式不正确');
    }
    
    return { success: true, data: response.data };
  } catch (error) {
    logResult(`❌ 检查是否点赞视频失败`);
    logResult(`❌ 异常信息: ${error.message}`);
    if (error.response) {
      logResult(`❌ 响应状态: ${error.response.status}`);
      logResult(`❌ 响应数据: ${JSON.stringify(error.response.data)}`);
    }
    return { success: false, error: error.response?.data || error.message };
  }
}

// 测试检查是否收藏视频
async function testCheckFavoritedVideo(token) {
  try {
    // 使用视频ID为11进行测试
    const videoId = '11';
    logResult(`\n测试检查是否收藏视频...`);
    logResult(`请求URL: ${CONFIG.baseURL}/users/me/favorites/video/${videoId}/check`);
    
    const response = await axios.get(`${CONFIG.baseURL}/users/me/favorites/video/${videoId}/check`, {
      headers: {
        'Authorization': `Bearer ${token}`
      }
    });
    
    logResult(`响应状态码: ${response.status}`);
    logResult(`响应数据: ${JSON.stringify(response.data, null, 2)}`);
    
    if (response.data.success && 'data' in response.data) {
      logResult(`是否收藏: ${response.data.data.isFavorited ? '✅ 已收藏' : '❌ 未收藏'}`);
      logResult('✅ 检查是否收藏视频接口调用成功');
    } else {
      logResult('❌ 接口调用成功但返回数据格式不正确');
    }
    
    return { success: true, data: response.data };
  } catch (error) {
    logResult(`❌ 检查是否收藏视频失败`);
    logResult(`❌ 异常信息: ${error.message}`);
    if (error.response) {
      logResult(`❌ 响应状态: ${error.response.status}`);
      logResult(`❌ 响应数据: ${JSON.stringify(error.response.data)}`);
    }
    return { success: false, error: error.response?.data || error.message };
  }
}

// 主测试函数
async function runTests() {
  try {
    // 初始化测试文件
    initTestFile();
    logResult('开始用户视频关系接口测试...');
    
    // 1. 登录
    const loginResult = await login();
    if (!loginResult.success) {
      logResult('\n❌ 测试失败: 无法登录');
      process.exit(1);
    }
    
    const { token } = loginResult;
    
    // 2. 测试检查是否关注视频
    const followingResult = await testCheckFollowingVideo(token);
    if (!followingResult.success) {
      logResult('\n❌ 测试失败: 检查是否关注视频失败');
      process.exit(1);
    }
    
    // 3. 测试检查是否点赞视频
    const likedResult = await testCheckLikedVideo(token);
    if (!likedResult.success) {
      logResult('\n❌ 测试失败: 检查是否点赞视频失败');
      process.exit(1);
    }
    
    // 4. 测试检查是否收藏视频
    const favoritedResult = await testCheckFavoritedVideo(token);
    if (!favoritedResult.success) {
      logResult('\n❌ 测试失败: 检查是否收藏视频失败');
      process.exit(1);
    }
    
    logResult('\n🎉 所有视频关系接口测试通过！');
    process.exit(0);
  } catch (error) {
    logResult(`\n❌ 测试过程中发生未预期错误: ${error}`);
    process.exit(1);
  }
}

// 运行测试
runTests();